package com.ttit.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.ttit.annotated.entity.CustomUtils;
import com.ttit.annotated.entity.Person;

public class MainActivity extends AppCompatActivity {
    private Button btnOne, btnTwo;
//下面有注解的使用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_btn);

        btnOne = (Button) findViewById(R.id.btnOne);
        btnTwo = (Button) findViewById(R.id.btnTwo);
        btnTwo.setOnClickListener(new View.OnClickListener() {  //按钮绑定点击事件
            @Override
            public void onClick(View v) {
                if (btnTwo.getText().toString().equals("按钮不可用")) {
                    btnOne.setEnabled(false);
                    btnTwo.setText("按钮可用");
                } else {
                    btnOne.setEnabled(true);
                    btnTwo.setText("按钮不可用");
                }
            }
        });
        CustomUtils.getInfo(Person.class);  //注解介绍
    }

}
/*
@Target
修饰的对象范围：packages、types（类、接口、枚举、Annotation类型）、类型成员（方法、构造方法、成员变量、枚举值）、
方法参数和本地变量（如循环变量、catch参数）。
作用：用于描述注解的使用范围。
ElementType 取值：
1. CONSTRUCTOR:用于描述构造器
2. FIELD:用于描述域
3. LOCAL_VARIABLE:用于描述局部变量
4. METHOD:用于描述方法
5. PACKAGE:用于描述包
6. PARAMETER:用于描述参数
7. TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention
定义了该 Annotation 被保留的时间长短：某些 Annotation 仅出现在源代码中，而被编译器丢弃；而另一些却被编译在class文件
中；编译在class文件中的Annotation可能会被虚拟机忽略，而另一些在 class 被装载时将被读取（请注意并不影响 class 的执行，
因为 Annotation 与 class 在使用上是被分离的）。使用这个 meta-Annotation 可以对  Annotation 的“生命周期”限制。
作用：表示需要在什么级别保存该注释信息，用于描述注解的生命周期（即：被描述的注解在什么范围内有效）
RetentionPoicy取值:
SOURCE:在源文件中有效（即源文件保留）
CLASS:在class文件中有效（即class保留）
RUNTIME:在运行时有效（即运行时保留）

@Document
用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共API，因此可以被例如 javadoc 此类的工具文档化。
Documented 是一个标记注解，没有成员。
作用：表示需要在什么级别保存该注释信息，用于描述注解的生命周期（即：被描述的注解在什么范围内有效）。

@Inhrited

是一个标记注解，@Inherited 阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited 修饰的 annotation类型
被用于一个 class，则这个 annotation 将被用于该class的子类。

@Inherited annotation类型 是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation，方法并不从它
所重载的方法继承annotation

当 @Inherited annotation类型 标注的 annotation 的 Retention 是 RetentionPolicy.RUNTIME，则反射API增强
了这种继承性。如果我们使用java.lang.reflect 去查询一个 @Inherited annotation类型 的 annotation 时，反射代码
检查将展开工作：检查class和其父类，直到发现指定的 annotation 类型被发现，或者到达类继承结构的顶层。
* */
